package ar.uba.fi.algo3.algoTank.Objetos.Tanques;

import java.io.Serializable;

import ar.uba.fi.algo3.algoTank.Interfaces.Direccionable;
import ar.uba.fi.algo3.algoTank.Objetos.Direccion;
import ar.uba.fi.algo3.algoTank.Objetos.ObjetoMovil;
import ar.uba.fi.algo3.algoTank.Objetos.Posicion;
import ar.uba.fi.algo3.algoTank.Objetos.Proyectil;
import ar.uba.fi.algo3.algoTank.Objetos.Territorio;
import ar.uba.fi.algo3.algoTank.Objetos.Equipamiento.Arma;

public abstract class Tanque extends ObjetoMovil implements Direccionable, Serializable {

	private static final long serialVersionUID = 2L;
	private float energia;
	protected Arma armaActual;
	protected float frecuenciaDeDisparo;
	protected float tiempoDesdeUltimoDisparo; 
	protected int puntos;
	protected int puntosPorDestruccion;
	
	
	public Tanque() {	
		super();
		this.tiempoDesdeUltimoDisparo = 0;
		this.puntos = 0;
		//todos los tanques tienen el mismo tama�o y energia
		this.ubicacion.setAncho(20);
		this.ubicacion.setAlto(20);
		this.energia = 100;
		this.movimiento.setVelocidad(5);
		this.puntosPorDestruccion = 0;
	}
	
	public Tanque(Posicion posicion,Territorio territorio) {
		super(posicion, territorio);
		this.tiempoDesdeUltimoDisparo = 0;
		//todos los tanques tienen el mismo tama�o
		this.ubicacion.setAncho(20);
		this.ubicacion.setAlto(20);
		this.energia = 100;
		this.movimiento.setVelocidad(5);
		this.puntosPorDestruccion = 0;
	}
	
	public void addPuntos(int punt){
		this.puntos = puntos + punt;
	}
	
	public int getPuntos(){
		return this.puntos;
	}
	
	public void setPuntos(int puntos){
		
		this.puntos = puntos;
	}
	

	
	public void daniarse(float danio){
		energia = energia-danio;
		if (energia <= 0)
			this.morir();
	}
	
	//get/set
	public float getEnergia(){
		return this.energia;
	}
	
	public void setEnergia(float energia){
		this.energia = energia;
	}	

	public void setArmaActual(Arma arma){
		this.armaActual = arma;
	}
	
	public Arma getArmaActual(){
		return this.armaActual;
	}
	//////////
	
	public void mirarDerecha(){
		Direccion dir = new Direccion();
		dir.derecha();
		this.movimiento.setDireccion(dir);
	}
	
	public void mirarIzquierda(){
		Direccion dir = new Direccion();
		dir.izquierda();
		this.movimiento.setDireccion(dir);
	}
	
	public void mirarAbajo(){
		Direccion dir = new Direccion();
		dir.abajo();
		this.movimiento.setDireccion(dir);
	}
	
	public void mirarArriba(){
		Direccion dir = new Direccion();
		dir.arriba();
		this.movimiento.setDireccion(dir);
	}
	
	public Direccion getDireccion() {
		return movimiento.getDireccion();
	}
	
	
	public boolean puedeDisparar() {
		return (frecuenciaDeDisparo < tiempoDesdeUltimoDisparo);
	}
	
	public abstract void disparar();
	
	
	public void interactuarConProyectil(Proyectil proyectil) {
		this.daniarse(proyectil.getDanio());
		proyectil.morir();
		
		if (!estaVivo())
			proyectil.getDuenio().addPuntos(this.getPuntosPorDestruccion());	
	}

	public int getPuntosPorDestruccion() {
		return puntosPorDestruccion;
	}
	
	
}
